package com.zm.common.core.util;


import java.util.Arrays;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.util.Calendar;
/**
 * DateUtil 这是旧ACS系统的Date工具类，与WakeUpSetingDB类搭配使用.
 * @author DENG.ZHUO.HUI
 * @email 13751827792@163.com
 * @date 2017年3月13日
 * @version 1.0
 */
public class DateUtil {
	
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	public static final int SECOND = 1; 
	
	public static final int MINUTE = 2; 
	
	public static final int HOUR = 3; 
	
	public static final int DAY = 4;
	
//	public static final int WEEK = 5;
//	
//	public static final int MONTH = 6;
//	
//	public static final int YEAR = 7;
	
	public DateUtil()
	{
		
	}
	//获取年
	public static String getYear(Date date)
	{
		String year=new SimpleDateFormat("yyyy").format(date);
		return year;
	}
	//月
	public static String getMonth(Date date)
	{
		String month=new SimpleDateFormat("MM").format(date);
		return month;
	}
	public static String getMonthOfCad()
	{
		Calendar d=Calendar.getInstance();
		int m=d.get(Calendar.MONTH);
		if(m<10)
		{
			return "0"+m;
		}
		return m+"";
	}
	//日
	public static String getDay(Date date)
	{
		String day=new SimpleDateFormat("dd").format(date);
		return day;
	}
	//时
	public static String getHour(Date date)
	{
		String hour=new SimpleDateFormat("HH").format(date);
		return hour;
	}
	//分
	public static String getMin(Date date)
	{
		String min=new SimpleDateFormat("mm").format(date);
		return min;
	}
	//年-月-日
	public static String getYear_Month_Day(Date date)
	{
		String Year_Month_Day=new SimpleDateFormat("yyyy-MM-dd").format(date);
		return Year_Month_Day;
	}
	//年-月-日 时：分：秒
	public static String getYear_Month_Day_andTime(Date date)
	{
		String Year_Month_Day_andTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
		return Year_Month_Day_andTime;
	}
	//一个月前
	public static String getBeforeMonth(Date date)
	{
		String BeforeMonth=new SimpleDateFormat("yyyy-MM-dd").format(date);
		
		return BeforeMonth;
	}
	//获取前一个月
	public static String getBeforeAMonth()
	{
		Calendar d=Calendar.getInstance();
		d.add(Calendar.MONTH, -1);
		String date=new String();
		date=""+d.get(Calendar.YEAR);
		int mon=(d.get(Calendar.MONTH)+1);
		int day=d.get(Calendar.DATE);
		if(mon>=10)
		{
			date+="-"+mon;
		}
		else if(mon<10)
		{
			date+="-0"+mon;
		}
		if(day<10)
		{
			date+="-0"+day;
		}
		else
		{
			date+="-"+day;
		}
		
		return date;
		
	}
	//获取后一天
	public static String getTomorrow()
	{
		Calendar d=Calendar.getInstance();
		d.add(Calendar.DATE, +1);
		String date="";
		date=""+d.get(Calendar.YEAR);
		int mon=(d.get(Calendar.MONTH)+1);
		int day=d.get(Calendar.DATE);
		if(mon>=10)
		{
			date+="-"+mon;
		}
		else if(mon<10)
		{
			date+="-0"+mon;
		}
		if(day<10)
		{
			date+="-0"+day;
		}
		else
		{
			date+="-"+day;
		}
		return date;
	}
	//获取当前时间
	public static String getNowTime(Date date)
	{
		String HH_MM=new SimpleDateFormat("HH:mm").format(date);
		return HH_MM;
	}
	//当前加20分钟
	public static String addMin()
	{
		Calendar d=Calendar.getInstance();
		d.add(Calendar.MINUTE, +20);
		return d.get(Calendar.YEAR)+"-"+d.get(Calendar.MONTH)+"-"+d.get(Calendar.DATE)+
		" "+d.get(Calendar.HOUR_OF_DAY)+":"+d.get(Calendar.MINUTE)+":"+d.get(Calendar.SECOND);
	}
	//时间加
	//减一天
	public static String addDay(String date)
	{
		if(date.length()<10)
		{
			return date;
		}
		int year=Integer.parseInt(date.substring(0, 4).trim());
		int day=Integer.parseInt(date.substring(8).trim());
		int month=Integer.parseInt(date.substring(5,7).trim());
		Calendar d=Calendar.getInstance();
		d.set(year, month, day);
		d.add(Calendar.DATE, -1);
		return d.get(Calendar.YEAR)+"-"+d.get(Calendar.MONTH)+"-"+d.get(Calendar.DATE);
		
	}
	/**
	 * 
	 * @param date Date 待处理日期
	 * @param mus int 需要减去的分钟数
	 * @return 返回日期减去分钟mus的时间
	 */
	public static String cutMus(Date date,int mus)
	{
		if(date==null)
		{
			return null;
		}
		Calendar d=Calendar.getInstance();
		d.setTime(date);
		d.add(Calendar.MINUTE, -mus);
		return d.get(Calendar.YEAR)+"-"+(d.get(Calendar.MONTH)+1)+"-"+d.get(Calendar.DATE)+
				" "+d.get(Calendar.HOUR_OF_DAY)+":"+d.get(Calendar.MINUTE)+":"+d.get(Calendar.SECOND);
	}
	//减去12小时
	public static String cutTHour(String date)
	{
		if(date.length()<15)
		{
			return date;
		}
		int year=Integer.parseInt(date.substring(0, 4).trim());
		int day=Integer.parseInt(date.substring(8,10).trim());
		int month=Integer.parseInt(date.substring(5,7).trim());
		int hour=Integer.parseInt(date.substring(11, 13).trim());
		int min=Integer.parseInt(date.substring(14, 16).trim());
		Calendar d=Calendar.getInstance();
		d.set(year, month, day, hour, min);
		d.add(Calendar.HOUR_OF_DAY, -24);
		return d.get(Calendar.YEAR)+"-"+d.get(Calendar.MONTH)+"-"+d.get(Calendar.DAY_OF_MONTH)+
		" "+d.get(Calendar.HOUR_OF_DAY)+":"+d.get(Calendar.MINUTE)+":"+d.get(Calendar.SECOND);
	}
	//获得当前时间 HH:MM:SS
	public static String getNowTimes(Date date)
	{
		return new SimpleDateFormat("HH:mm:ss").format(date);
	}
	//24小时前
	public static int  befTwenty()
	{
		Calendar c=Calendar.getInstance();
		c.add(Calendar.HOUR_OF_DAY, -23);
		return c.get(Calendar.HOUR_OF_DAY);
	}
	//日期比较
	/**
	 * 日期比较
	 * @param DATE1 String  比较日期
	 * @param DATE2 String  比较日期
	 * @return DATE1 在DATE2前 时返回 1, DATE1在DATE2后 返回-1,异常时返回0
	 */
	public static int compare_date(String DATE1, String DATE2) {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		try {
		Date dt1 = df.parse(DATE1);
		Date dt2 = df.parse(DATE2);
		if (dt1.getTime() >= dt2.getTime()) {
		System.out.println("dt1 在dt2前");
		return 1;
		} else if (dt1.getTime() < dt2.getTime()) {
		System.out.println("dt1在dt2后");
		return -1;
		} else {
		return 0;
		}
		} catch (Exception exception) {
		exception.printStackTrace();
		return 0;
		}
		
		}
	//日期比较
	/**
	 * 日期比较
	 * @param dt1 Date 比较日期
	 * @param dt2 Date  比较日期
	 * @return dt1 在dt2前 时返回 1, dt1在dt2后 返回-1,异常时返回0
	 */
	public static int compare_date(Date dt1, Date dt2) {

		try {
			if (dt1.getTime() >= dt2.getTime()) {
			
				System.out.println("dt1 在dt2前");
				return 1;
			} 
			else if (dt1.getTime() < dt2.getTime()) 
			{
				System.out.println("dt1在dt2后");
				return -1;
			} 
			else 
			{
				return 0;
			}
		} 
		catch (Exception exception) 
		{
			exception.printStackTrace();
			return 0;
		}	
	}
	//按日期大小进行排列
	/*
	 * 返回一个long形式的数组，改形式符合日期长度20111124163222==2011-11-24 16:32:22
	 * 参数：date String数组，即为日期
	 */
	public static long[] sortByDate( String[]date)
	{
		if(date==null||date.length<=0)
		{
			return null;
		}
		long []dateL=new long[date.length];
		for(int i=0;i<date.length;i++)
		{
			String d=date[i].replaceAll("[\\s||\\-||\\:]", "");
			long s1=Integer.parseInt(d);
			dateL[i]=s1;
		}
		Arrays.sort(dateL);
		return dateL;
	}
	//日期格式转换,把日期20111125104350换2011-11-25 10:43:50
	/**
	 * 参数  String类型
	 */
	public static String dateFormatTo(String date)
	{
		StringBuffer sf=new StringBuffer();
		if(date.length()>12)
		{
			sf.append(date.substring(0, 4));//2011
			sf.append("-");
			sf.append(date.substring(4, 6));//11
			sf.append("-");
			sf.append(date.substring(6, 8));//25
			sf.append(" ");
			sf.append(date.substring(8, 10));
			sf.append(":");
			sf.append(date.substring(10, 12));
			sf.append(":");
			sf.append(date.substring(12));
		}
		if(date.length()==8)
		{
			sf.append(date.substring(0, 4));//2011
			sf.append("-");
			sf.append(date.substring(4, 6));//11
			sf.append("-");
			sf.append(date.substring(6, 8));//25
		}
		return sf.toString();
	}

	/**
	 * 日期相加
	 * 参数1 date String 类型需要相加的日期
	 * 参数2 field int 相加的字段（用Calendar中的字段表示）
	 * 参数3 time int 类型相加的数值。
	 */
	public static Date dateAddMedthod(String date,int field,int time)
	{
		try
		{
			DateFormat d=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			
			Date dates=d.parse(date);
			//long times=dates.getTime();
			Calendar g=Calendar.getInstance();
			g.setTime(dates);
			g.add(field, time);
			//Date ds=d.setCalendar(g);
			return g.getTime();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return null;
		//return date;
	}
	/**
	 * 时间相加减
	 * time 需要相加减的时间  格式可以为：00:00:01 或者:000001
	 * ation 加或者减 add为加，cut 为减
	 * sce 需要相加减的时间单位为秒 最大为3600不等于3600秒
	 */
	public String handleTime(String time,String ation,int sce)
	{
		if(sce>=3600||time==null)
		{
			return time;
		}
		time=time.replaceAll("[\\s||\\-||\\:]", "");
		if("cut".equals(ation))
		{
			System.out.println("待处理的时间"+time+"动作"+ation);
			String hour=time.substring(0, 2);
			String min=time.substring(2, 4);
			String sc=time.substring(4);
			int scI=Integer.parseInt(sc);
			int minI=Integer.parseInt(min);
			int hourI=Integer.parseInt(hour);
	
			if(sce<60)
			{
				if((scI-sce)<0)
				{
					scI=scI+60-sce;
					minI=minI-1;
				}
				else
				{
					scI=scI-sce;
				}
				if(minI<0)
				{
					hourI=hourI-1;
					minI=minI+60;
					if(hourI<0)
					{
						hourI=hourI+24;
					}
				}
				else
				{
					minI=minI-1;
				}
			}
			if(sce>=60)
			{
				int minT=sce/60;
				int sceT=sce%60;
				
				if((scI-sceT)<0)
				{
					scI=scI+60-sceT;
					minI=minI-1;
				}
				else
				{
					scI=scI-sceT;
				}
				if((minI-minT)<0)
				{
					hourI=hourI-1;
					minI=minI+60-minT;
					if(hourI<0)
					{
						hourI=hourI+24;
					}
				}
				else
				{
					minI=minI-minT;
				}
			
			}
			
			StringBuffer sf=new StringBuffer();
			if((""+hourI).length()<2)
			{
				sf.append("0"+hourI);
			}
			else
			{
				sf.append(""+hourI);
			}
			if((""+minI).length()<2)
			{
				sf.append("0"+minI);
			}
			else
			{
				sf.append(""+minI);
			}
			if((""+scI).length()<2)
			{
				sf.append("0"+scI);
			}
			else
			{
				sf.append(""+scI);
			}
			System.out.println("返回的时间"+sf.toString()+"动作"+ation);
			return sf.toString();
		}
		if("add".equals(ation))
		{

			System.out.println("待处理的时间"+time+"动作"+ation);
			String hour=time.substring(0, 2);
			String min=time.substring(2, 4);
			String sc=time.substring(4);
			int scI=Integer.parseInt(sc);
			int minI=Integer.parseInt(min);
			int hourI=Integer.parseInt(hour);
			if(sce<60)
			{
				if((scI+sce)>=60)
				{
					scI=scI-60+sce;
					minI=minI+1;
				}
				if((minI)>=60)
				{
					hourI=hourI+1;
					minI=minI-60;
					if(hourI>=24)
					{
						hourI=hourI-24;
					}
				}
			}
			else
			{
				int minT=sce/60;
				int sceT=sce%60;
				if((scI+sceT)>=60)
				{
					scI=scI-60+sceT;
					minI=minI+1;
				}
				if((minI+minT)>=60)
				{
					hourI=hourI+1;
					minI=minI-60+minT;
					if(hourI>=24)
					{
						hourI=hourI-24;
					}
				}
				else
				{
					minI=minI+minT;
				}
			}
			
			StringBuffer sf=new StringBuffer();
			if((""+hourI).length()<2)
			{
				sf.append("0"+hourI);
			}
			else
			{
				sf.append(""+hourI);
			}
			if((""+minI).length()<2)
			{
				sf.append("0"+minI);
			}
			else
			{
				sf.append(""+minI);
			}
			if((""+scI).length()<2)
			{
				sf.append("0"+scI);
			}
			else
			{
				sf.append(""+scI);
			}
			System.out.println("返回的时间"+sf.toString()+"动作"+ation);
			return sf.toString();
		
		}
		return time;
	}
	/**
	 * string的日期转换为Date格式
	 * @param timeStr String 时间 格式  yyyy-MM-dd HH:mm:ss
	 * @return 转换无异常返回对应的date 返回返回null
	 */
	public static Date getDateForString(String timeStr)
	{
		DateFormat d=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		
		try {
			Date dates = d.parse(timeStr);
			return dates;
		} catch (ParseException e) {
			
			e.printStackTrace();
			return null;
		}
		
	}
	/**
	 * 
	 * @param a 时间a格式为yyyy-MM-dd HH:mm:ss
	 * @param b 时间b格式为yyyy-MM-dd HH:mm:ss
	 * @return 返回相隔秒数 >0 a时间比较大;<0 b时间比较大
	 */
	public static String compareDateTime(String a,String b)
	{
		DateFormat d=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try
		{
			if(a==null||"".equals(a))
			{
				return "false";
			}
			if(b==null||"".equals(b))
			{
				return "true";
			}
			long ltimeA=d.parse(a).getTime()/1000;
			long ltimeB=d.parse(b).getTime()/1000;
			return ltimeA-ltimeB+"";
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return "false";
		}
	}

	/**
	 * 时间date加上second秒
	 * @param date Date
	 * @param second int(+:加时间/-:减时间)
	 * @return String
	 */
	public static String befordSecord(String date, int second){
		int year=Integer.parseInt(date.substring(0, 4).trim());
		int day=Integer.parseInt(date.substring(8,10).trim());
		int month=Integer.parseInt(date.substring(5,7).trim())-1;
		int hour=Integer.parseInt(date.substring(11, 13).trim());
		int min=Integer.parseInt(date.substring(14, 16).trim());
		int sec=Integer.parseInt(date.substring(17,19).trim());
		Calendar d=Calendar.getInstance();
		d.set(year, month, day, hour, min, sec);
		d.add(Calendar.SECOND, second);
		return d.get(Calendar.YEAR)+"-"+(d.get(Calendar.MONTH)+1)+"-"+d.get(Calendar.DAY_OF_MONTH)+
		" "+d.get(Calendar.HOUR_OF_DAY)+":"+d.get(Calendar.MINUTE)+":"+d.get(Calendar.SECOND);
	}
	
	/**
	 * date字符串(yyyy-MM-dd HH:mm:ss)转Date
	 * @param timeStr
	 * @return
	 */
	public static Date SdfParse(String timeStr){
		try {
			return sdf.parse(timeStr);
		} catch (ParseException e) {
			e.printStackTrace();
			throw new RuntimeException("日期转换错误",e);
		}
	}
	
	/**
	 * 
	 * @param date1 
	 * @param date2 
	 * @param unit 返回结果的单位，可以选择SECOND,MINUTE,HOUR,WEEK
	 * @return 返回结果为-1时异常，为0时表示结果小于1
	 */
	public static long getDateInterval(Date date1,Date date2,int unit){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date1);
		
		long time1 = date1.getTime();
		long time2 = date2.getTime();
		long interval = Math.abs(time1 - time2);
		if(unit == 1){ 
			return interval / 1000; // second
		}else if(unit == 2){
			return interval / (60 * 1000); // minute
		}else if(unit == 3){
			return interval / (60 * 60 * 1000); // hour
		}else if(unit == 4){
			return interval / (24 * 60 * 60 * 1000); // day
		}
		return -1;
	}
}
